#include "disk.h"

#define DISK_TEMPLATE   template<           \
                            typename file_t \
                        >
#define DISK_CLASS      DISK<file_t>


/**
 * @brief : 
 *      获取文件流
 * @return : 
 *      file_t ： 返回磁盘的文件流指针
 */
DISK_TEMPLATE
file_t* DISK_CLASS::get_file() 
{
    return file;
}

/**
 * @brief : 
 *      读入文件
 * @param : 
 *      const char* : 传入文件路径
 * @return : 
 *      word_T ： 读取成功 1，失败返回 0
 */
DISK_TEMPLATE
int DISK_CLASS::read_file(const char* file_path) 
{
    file = fopen(file_path, "rb");
    if (!file) {
        return 0;
    }
    return 1;
}

/**
 * @brief : 
 *      关闭文件流
 */
DISK_TEMPLATE
void DISK_CLASS::close_file() 
{
    if(file) {
        fclose(file);
        file = NULL;
    }
}

DISK_TEMPLATE
void DISK_CLASS::request_addr(void* buf, int size)
{
    /** 
     * 先读入第一条指令到内存 
     * LC-3 汇编中，第一条指令是 .ORIG 汇编汇编制导命令
     * 用来指明程序加载进内存的起始位置
     */                          
    fread(buf, size, 1, file);
}

DISK_TEMPLATE
int DISK_CLASS::load_image(void* buf, int num)
{
    /* 从文件中读取 num 个字节的数据到指定的 buf 缓冲区 */
    int read = fread(buf, sizeof(char), num, file);
    return read;
}


